package com.hb.unic.core.log;

import com.hb.unic.core.log.support.ILoggerConsts;
import com.hb.unic.core.log.support.LoggerInfo;
import org.slf4j.Logger;
import org.slf4j.MDC;
import org.slf4j.helpers.MessageFormatter;

import com.alibaba.fastjson.JSON;
import com.hb.unic.core.context.Application;
import com.hb.unic.core.util.RequestUtils;

import lombok.SneakyThrows;

/**
 * 日志对象
 *
 * @since v1.0，2023/8/25 22:50，create by Mr.Huang.
 */
public class UnicLogger {

    /**
     * 真是日志对象
     */
    private final Logger delegator;

    /**
     * 构造方法
     */
    protected UnicLogger(Logger logger) {
        delegator = logger;
    }

    /**
     * 判断Debug日志级别是否可用
     *
     * @return true为可用
     */
    public boolean isDebugEnabled() {
        return this.delegator.isDebugEnabled();
    }

    /**
     * 判断Info日志级别是否可用
     *
     * @return true为可用
     */
    public boolean isInfoEnabled() {
        return this.delegator.isInfoEnabled();
    }

    /**
     * 判断Warn日志级别是否可用
     *
     * @return true为可用
     */
    public boolean isWarnEnabled() {
        return this.delegator.isWarnEnabled();
    }

    /**
     * 判断Error日志级别是否可用
     *
     * @return true为可用
     */
    public boolean isErrorEnabled() {
        return this.delegator.isErrorEnabled();
    }

    /**
     * debug级别的日志打印
     *
     * @param format 格式化的日志信息
     * @param arguments 参数
     */
    public void debug(String format, Object... arguments) {
        String message = MessageFormatter.arrayFormat(format, arguments).getMessage();
        LoggerInfo loggerInfo = this.createLoggerEntity(message);
        this.delegator.debug(JSON.toJSONString(loggerInfo));
    }

    /**
     * info级别的日志打印
     *
     * @param format 格式化的日志信息
     * @param arguments 参数
     */
    public void info(String format, Object... arguments) {
        String message = MessageFormatter.arrayFormat(format, arguments).getMessage();
        LoggerInfo loggerInfo = this.createLoggerEntity(message);
        this.delegator.info(JSON.toJSONString(loggerInfo));
    }

    /**
     * warn级别的日志打印
     *
     * @param format 格式化的日志信息
     * @param arguments 参数
     */
    public void warn(String format, Object... arguments) {
        String message = MessageFormatter.arrayFormat(format, arguments).getMessage();
        LoggerInfo loggerInfo = this.createLoggerEntity(message);
        this.delegator.warn(JSON.toJSONString(loggerInfo));
    }

    /**
     * error级别的日志打印
     *
     * @param format 格式化的日志信息
     * @param arguments 参数
     */
    public void error(String format, Object... arguments) {
        String message = MessageFormatter.arrayFormat(format, arguments).getMessage();
        LoggerInfo loggerInfo = this.createLoggerEntity(message);
        this.delegator.error(JSON.toJSONString(loggerInfo));
    }

    /**
     * 构建日志信息模板
     * 
     * @param message 日志信息
     * @return 标准日志
     */
    @SneakyThrows
    private LoggerInfo createLoggerEntity(Object message) {
        LoggerInfo entity = new LoggerInfo();
        entity.setAppName(Application.getProperties().get("spring.application.name"));
        entity.setContent(message);
        entity.setRequestUri(RequestUtils.getRequestUri());
        entity.setClientName("");
        entity.setClientIp(RequestUtils.getRequestIp());
        entity.setServerName(RequestUtils.getServiceName());
        entity.setServerIp(RequestUtils.getServiceIp());
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        entity.setFileName(stackTraceElements[3].getClassName());
        entity.setFileLine(stackTraceElements[3].getLineNumber());
        entity.setTraceId(MDC.get(ILoggerConsts.TRACE_ID));
        return entity;
    }

}
